package com.wuuxiang.polestar.admin.web;

import com.wuuxiang.polestar.admin.dto.*;
import com.wuuxiang.polestar.admin.service.propertyitem.IPropertyItemService;
import com.wuuxiang.polestar.admin.utils.OvalUtils;
import com.wuuxiang.polestar.comm.constant.Constant;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 项目名称：polestar        <br>
 * 类描述：                         <br>
 * 创建人：夏鸿鹏                    <br>
 * 创建时间：2017-11-28 14:46        <br>
 * 修改备注：                       
 *  <br>
 */
@RestController
public class ConfigController {

    @Autowired
    private IPropertyItemService propertyItemService;

    @RequestMapping("/polestar/createConfig")
    @ResponseBody
    public BaseReturnDTO createConfig(@RequestBody ConfigDto configDto) {
        BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
        if (OvalUtils.validate(baseReturnDTO, configDto)) {
            return baseReturnDTO;
        }
        String teamName = configDto.getTeamName().trim();
        String propertyName = configDto.getPropertyName().trim();
        String itemName = configDto.getItemName().trim();
        if (propertyItemService.checkExists(teamName, propertyName, itemName)) {
            baseReturnDTO.setReturnCode(-1);
            baseReturnDTO.setErrorCode("500");
            baseReturnDTO.setErrorText("配置项已经存在!");
        } else {
			propertyItemService.createPropertyItem(teamName, propertyName, itemName, configDto.getValue(),
					configDto.getRemark(), true);
        }
        return baseReturnDTO;
    }

    @RequestMapping("/polestar/removeConfig")
    @ResponseBody
    public BaseReturnDTO removeConfig(@RequestBody ConfigDto configDto) {
        BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
        if (OvalUtils.validate(baseReturnDTO, configDto)) {
            return baseReturnDTO;
        }
        String teamName = configDto.getTeamName().trim();
        String propertyName = configDto.getPropertyName().trim();
        String itemName = configDto.getItemName().trim();
        if (propertyItemService.checkExists(teamName, propertyName, itemName)) {
            propertyItemService.removePropertyItem(teamName, propertyName, itemName);
        }
        return baseReturnDTO;
    }


    @RequestMapping("/polestar/updateConfig")
    @ResponseBody
    public BaseReturnDTO updateConfig(@RequestBody ConfigDto configDto) {
        BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
        if (OvalUtils.validate(baseReturnDTO, configDto)) {
            return baseReturnDTO;
        }
        String teamName = configDto.getTeamName();
        String propertyName = configDto.getPropertyName();
        String itemName = configDto.getItemName();
        if (propertyItemService.checkExists(teamName, propertyName, itemName)) {
            propertyItemService.updatePropertyItem(teamName, propertyName, itemName, configDto.getValue(), configDto.getRemark());
        }
        return baseReturnDTO;
    }

    @RequestMapping(value = "/polestar/getConfigLst")
    @ResponseBody
    public ConfigLstRetDto getConfigLst(@RequestBody PropertyDto propertyDto) {
        ConfigLstRetDto configLstRetDto = new ConfigLstRetDto();
        if (OvalUtils.validate(configLstRetDto, propertyDto)) {
            return configLstRetDto;
        }
        configLstRetDto.setConfigLst(propertyItemService.getPropertyItemLst(propertyDto.getTeamName(), propertyDto.getPropertyName()));
        return configLstRetDto;
    }
    
	@RequestMapping(value = "/polestar/releaseConfig")
	@ResponseBody
	public BaseReturnDTO releaseConfig(@RequestBody ReleaseConfigDto releaseConfigDto) {
		BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
		if (OvalUtils.validate(baseReturnDTO, releaseConfigDto)) {
			return baseReturnDTO;
		}
		String teamName = releaseConfigDto.getTeamName();
		String propertyName = releaseConfigDto.getPropertyName();
		String itemName = releaseConfigDto.getItemName();
		String value = propertyItemService.getPropertyItemTempValue(teamName, propertyName, itemName);
		if (StringUtils.isBlank(value)) {
			baseReturnDTO.setReturnCode(-1);
			baseReturnDTO.setErrorCode("500");
			baseReturnDTO.setErrorText("未发布中不存在此key的值!");
			return baseReturnDTO;
		}
		propertyItemService.releasePropertyItem(teamName, propertyName, itemName, value,releaseConfigDto.getUsername());
		return baseReturnDTO;
	}
	
	@RequestMapping(value = "/polestar/releaseConfigs")
	@ResponseBody
	public BaseReturnDTO releaseConfigs(@RequestBody ReleaseConfigsDto releaseConfigsDto) {
		BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
		if (OvalUtils.validate(baseReturnDTO, releaseConfigsDto)) {
			return baseReturnDTO;
		}
		List<ConfigDto> lst = propertyItemService.getPropertyItemLst(releaseConfigsDto.getTeamName(), releaseConfigsDto.getPropertyName());
		for (ConfigDto configDto : lst) {
			// 单条执行更新未发布的节点
			if(configDto.getReleaseStatus() == 0) {
				propertyItemService.releasePropertyItem(configDto.getTeamName(), configDto.getPropertyName(),
						configDto.getItemName(), configDto.getTempValue(),releaseConfigsDto.getUsername());
			}
		}
		return baseReturnDTO;
	}

	@RequestMapping(value = "/polestar/rollbackConfig")
	@ResponseBody
	public BaseReturnDTO rollbackConfig(@RequestBody ConfigDto configDto) {
		BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
		if (OvalUtils.validate(baseReturnDTO, configDto)) {
			return baseReturnDTO;
		}
		// 删除未发布中的key
		propertyItemService.removePropertyItem(Constant.CONFIG_TEMP_NODE, configDto.getTeamName(),
				configDto.getPropertyName(), configDto.getItemName());
		return baseReturnDTO;
	}
	
	@RequestMapping(value = "/polestar/rollbackConfigs")
	@ResponseBody
	public BaseReturnDTO rollbackConfigs(@RequestBody PropertyDto propertyDto) {
		BaseReturnDTO baseReturnDTO = new BaseReturnDTO();
		if (OvalUtils.validate(baseReturnDTO, propertyDto)) {
			return baseReturnDTO;
		}
		List<ConfigDto> lst = propertyItemService.getPropertyItemLst(propertyDto.getTeamName(), propertyDto.getPropertyName());
		for (ConfigDto configDto : lst) {
			if(configDto.getReleaseStatus() == 0) {
				// 删除未发布中的key
				propertyItemService.removePropertyItem(Constant.CONFIG_TEMP_NODE, configDto.getTeamName(),
						configDto.getPropertyName(), configDto.getItemName());
			}
		}
		return baseReturnDTO;
	}
}
